﻿using System;
using System.Windows.Forms;
// для работы с библиотекой OpenGL 
using Tao.OpenGl;
// для работы с библиотекой FreeGLUT 
using Tao.FreeGlut;

// для работы с элементом управления SimpleOpenGLControl 

namespace proba_pera
{
    public partial class Form1 : Form
    {
        readonly RwpUnit _unit;
        private readonly RwpUnit _barrier;
        private readonly Visualiser _rwpVisualiser;
        private readonly Collector _rwpCollector;
        private UnitsController _rwpUnitController;
        public Form1()
        {
            InitializeComponent();
            AnT.InitializeContexts();
            _unit = new RwpUnit(10, 10, 1, 1);
            _barrier = new RwpUnit(12, 12, 2, 2);
            _rwpCollector = new Collector();
// ReSharper disable ObjectCreationAsStatement
            new Ways(_rwpCollector);
// ReSharper restore ObjectCreationAsStatement
            _rwpCollector.Add(_unit);
            _rwpCollector.Add(_barrier);
            _rwpCollector.Add(new RwpUnit(12, 13, 3, 2));
            _rwpCollector.Add(new RwpUnit(12, 11, 4, 2));
            _rwpCollector.Add(new RwpUnit(12, 10, 5, 2));
            _rwpCollector.Add(new RwpUnit(12, 9, 6, 2));
            _rwpCollector.Add(new RwpUnit(12, 14, 7, 2));
            _rwpCollector.Add(new RwpUnit(12, 15, 8, 2));
            _rwpCollector.Add(new RwpUnit(12, 16, 9, 2));
            _rwpCollector.Add(new RwpUnit(12, 17, 10, 2));
            _rwpCollector.Add(new RwpUnit(12, 18, 11, 2));
            _rwpVisualiser = new Visualiser(AnT, _rwpCollector.GetList(), 0, 0);
            timer1.Start();
            _rwpUnitController = new UnitsController(_rwpVisualiser, _rwpCollector, AnT, 1, false);
            _rwpUnitController.SetLog(listBox1);
            _rwpUnitController.Ways.SetLog(listBox1);
            
        }

        


        private void Form1_Load(object sender, EventArgs e)
        {
            // инициализация Glut 
            Glut.glutInit();
            Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);

            // очитка окна 
            Gl.glClearColor(255, 255, 255, 1);

            // установка порта вывода в соотвествии с размерами элемента anT 
            Gl.glViewport(0, 0, AnT.Width, AnT.Height);

            // настройка проекции 
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();

            // теперь необходимо корректно настроить 2D ортогональную проекцию 
            // в зависимости от того, какая сторона больше 
            // мы немного варьируем то, как будет сконфигурированный настройки проекции
            if (AnT.Width <= (float)AnT.Height)
            {
                Glu.gluOrtho2D(0.0, 30.0 * AnT.Height / AnT.Width, 0.0, 30.0);
            }
            else
            {
                Glu.gluOrtho2D(0.0, 30.0 * AnT.Width / AnT.Height, 0.0, 30.0);
            }
            Gl.glMatrixMode(Gl.GL_MODELVIEW);
            Gl.glLoadIdentity();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            _rwpCollector.Renew();
            _rwpVisualiser.ConstructFrame();
        }

        private void AnT_Load(object sender, EventArgs e)
        {

        }

        private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
        {

        }

    }
}
